package com.ljf.common.utils;

import com.ljf.common.exception.ServiceException;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 时间工具类
 *
 * @author LJF
 * @since 2024-02-22
 */
public class DateUtil {

    private DateUtil() {

    }

    /**
     * 日期时间判断 正则表达式
     */
    private static final String DATE_PATTERN_MATCHER = "\\d{4}[-/]\\d{2}[-/]\\d{2}";
    /**
     * 日期时间判断 正则表达式
     */
    private static final String PATTERN_MATCHER = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
    /**
     * 日期格式
     */
    private static final String PATTERN = "yyyy-MM-dd HH:mm:ss";
    /**
     * 日期格式
     */
    private static final String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 年格式
     */
    private static final String DATE_YEAR = "yyyy";
    /**
     * 年月格式
     */
    private static final String DATE_YEAR_MONTH = "yyyyMM";
    /**
     * 年月日格式
     */
    private static final String DATE_YEAR_MONTH_DAY = "yyyyMMdd";

    /**
     * 格式化日期和时间
     *
     * @param date
     * @return
     */
    public static String format(Date date) {
        return formatCommonDate(date, PATTERN);
    }

    /**
     * 格式化日期
     *
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        return formatCommonDate(date, DATE_PATTERN);
    }

    /**
     * 格式化年
     *
     * @param date
     * @return
     */
    public static String formatYear(Date date) {
        return formatCommonDate(date, DATE_YEAR);
    }

    /**
     * 格式化年月
     *
     * @param date
     * @return
     */
    public static String formatYearMonth(Date date) {
        return formatCommonDate(date, DATE_YEAR_MONTH);
    }

    /**
     * 格式化年月日
     *
     * @param date
     * @return
     */
    public static String formatYearMonthDay(Date date) {
        return formatCommonDate(date, DATE_YEAR_MONTH_DAY);
    }

    /**
     * 格式化日期
     *
     * @param date
     * @param pattern
     * @return
     */
    public static String formatCommonDate(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 转化日期
     *
     * @param dateFormat
     * @return
     * @throws ServiceException
     */
    public static Date parseDate(String dateFormat) throws ServiceException {
        Pattern regexPattern = Pattern.compile(DATE_PATTERN_MATCHER);
        Matcher matcher = regexPattern.matcher(dateFormat);
        if (!matcher.matches()) {
            throw new ServiceException("转化异常:时间转换异常");
        }
        return parseCommonDate(dateFormat, DATE_PATTERN);
    }

    /**
     * 转化日期
     *
     * @param dateFormat
     * @return
     * @throws ServiceException
     */
    public static Date parse(String dateFormat) throws ServiceException {
        Pattern regexPattern = Pattern.compile(PATTERN_MATCHER);
        Matcher matcher = regexPattern.matcher(dateFormat);
        if (!matcher.matches()) {
            throw new ServiceException("转化异常:时间转换异常");
        }
        return parseCommonDate(dateFormat, PATTERN);
    }

    /**
     * 转化日期
     *
     * @param dateFormat
     * @return
     * @throws ServiceException
     */
    public static Date parseCommonDate(String dateFormat, String pattern) throws ServiceException {
        try {
            return new SimpleDateFormat(pattern).parse(dateFormat);
        } catch (ParseException e) {
            throw new ServiceException("转化异常:时间转换异常");
        }
    }

    /**
     * 获取日
     *
     * @param date
     * @return
     */
    public static int getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE);
    }

    /**
     * 获取月
     *
     * @param date
     * @return
     */
    public static int getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH);
    }

    /**
     * 添加天
     *
     * @param date
     * @param num
     * @return
     */
    public static Date addDate(Date date, int num) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        return calendar.getTime();
    }

}
